package hamming;

import java.util.Arrays;
import java.util.Random;

import utilities.FileUtility;

/**
 * Cette classe insere du bruit dans le message transmis 
 * 
 * @author Dapy, Dubie
 */
public class Bruiteur
{
	/** Numerateur du taux de probabilite */
	private final int numerateur;
	
	/** Denominateur du taux de probabilite */
	private final int denominateur;
	
	/** Tableau de probabilites */
	private boolean[] tauxProba;

	/**
	 * Constructeur
	 * 
	 * @param numerateur le numerateur pour la probabilite
	 * @param denominateur le denominateur pour la probabilite 
	 */
	public Bruiteur(int numerateur, int denominateur) 
	{
		this.numerateur = numerateur;
		this.denominateur = denominateur;
		remplirTableauProba();
	}
	
	/**
	 * Remplis le tableau de probabilites en fonction du taux de probabilite
	 */
	private void remplirTableauProba() 
	{
		tauxProba = new boolean[denominateur];
		Arrays.fill(tauxProba, false);
		
		for (int i = 0; i < numerateur; i++) 
		{
			tauxProba[numerateur] = true;
		}
	}

	/**
	 * Bruite le fichier en tirant un nombre aleatoire entre 0
	 * et le denominateur donne par l'utilisateur, puis ecrit le fichier recu
	 * 
	 * Exemple : l'utilisateur donne une probabilite de 5/100
	 * On met les 5 premieres cases du tableau de probabilite a true
	 * Si le chiffre tire en random est entre 0 et 5 alors on insere une erreur
	 * 
	 * @param args arguments 
	 */
	public void bruiter() 
	{
		String text = FileUtility.readFile("emis.txt");
		StringBuilder textBruite = new StringBuilder();
		String[] lignes = text.split(System.getProperty("line.separator"));
		
		for(String ligne : lignes){
			int step = 1;
			int ind = 0;
			while((ind + step)<= ligne.length())
			{
				String caractere = ligne.substring(ind,ind + step);
				Random rand = new Random();
				int tirage = rand.nextInt(tauxProba.length);
				if(tauxProba[tirage])
				{
					Integer intValue = Integer.valueOf(caractere);
					if(intValue == 0)
					{
						textBruite.append("1");
					}
					else
					{
						textBruite.append("0");
					}
				}
				else
				{
					textBruite.append(caractere);
				}
				ind++;
			}
			textBruite.append(System.getProperty("line.separator"));
		}
		FileUtility.writeFile(textBruite.toString(),"recu.txt");
	}
}
